經過一連串燒腦的利用 Compose 改寫介面後,來點不一樣的主題,轉換一下心情。
Apple 新的 M1 CPU 系列出來後,這一兩年有買 Mac 電腦的人不禁覺得苦惱。想要一嘗 M1 的強大性能,卻又苦於已經擁有了一台不算慢的 Mac 電腦,現在想轉賣又不見得能賣到什麼好價錢。一個折衷的方案是:買台最便宜的 M1 設備 Mac mini,然後讓原本的 Mac 電腦能呼叫這台 Mac mini 幫忙執行很花 CPU 的工作,像是編譯程式!如此一來,平常使用很順手的電腦就可以在另一台電腦辛苦的編譯程式時,還能照常地上網刷 FB 或是看 Youtube 影片。
為了要實現這想法,首先要來介紹一下一個好用的工具:mainframer。
mainframer Github 上寫得很清楚,這個工具可以協助你在遠端上執行指令,同時把執行後的結果再同步回電腦。
A tool that executes a command on a remote machine while syncing files back and forth. The process is known as remote execution (in general) and remote build (in particular cases).
在 Github 上,預設的分支是 3.x,但 3.x 的版本是有問題的(至少我試不出來,有人試成功的話,請留言告知,感謝),要先切到 2.x 的分支。
在本地端執行指令 ➊ 後,mainframer 會私底下幫忙執行 ➋ ➌ ➍ ➎。
在 README 中有說明怎麼設定,我這邊快速講一下。
REMOTE_MACHINE_ALIAS — 遠端 M1 Mac mini 的 SSH alias (我就取名為 m1)
REMOTE_MACHINE_IP_OR_HOSTNAME — 遠端 M1 Mac mini 的 IP
REMOTE_MACHINE_USERNAME — M1 Mac mini 上的使用者名稱
確認已經安裝了 ssh 和 rsync。
產生使用者的 SSH keyssh-keygen -t rsa -b 4096 -C "{REMOTE_MACHINE_USERNAME}"
把下面設定加到 ~/.ssh/config
中
Host {REMOTE_MACHINE_ALIAS}
User {REMOTE_MACHINE_USERNAME}
HostName {REMOTE_MACHINE_IP_OR_HOSTNAME}
Port 22
IdentityFile ~/.ssh/id_rsa
PreferredAuthentications publickey
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist 1h
以我自己的例子來說,會是長成下面這樣:
Host m1
User danielkao
HostName 192.168.1.145
Port 22
IdentityFile ~/.ssh/id_rsa
PreferredAuthentications publickey
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist 1h
$ pbcopy < ~/.ssh/id_rsa.pub
將最新版的 mainframer script 複製到 Android 專案的根目錄中。
.mainframer
目錄,並建立 config
檔案,填入以下資訊:remote_machine={REMOTE_MACHINE_ALIAS}
以我的例子來說,會是:
remote_machine=m1
.mainframer/ignore
.gradle
.git/*
.gitmodules
/.idea
/local.properties
/.mainframer
官方文件其實還有許多細步的設定可以調整。這些額外的選項可以在整個流程都通了之後,再斟酙修改。
$ mkdir -p ~/.ssh
$ chmod u+rwx,go= ~/.ssh
$ echo {SSH_KEY} >> ~/.ssh/authorized_keys
$ chmod u+rw,go= ~/.ssh
以開發 Android 來說,我有在 M1 Mac mini 中安裝了最新版的 Android Studio,先確認過 Android projects 可以正常在 M1 Mac mini 中編譯。
一切設定好之後,進到 Mac 的 Android 專案下,可以來執行 mainframer 了!
sh mainframer.sh ./gradlew clean assembleRelease
如果你的 Android 專案原本在 Mac 中的編譯時間需要到一兩分鐘或更久的話,透過遠端的 M1 機器執行,再同步 binary 回本機,將會感受到差異。
如果嫌打指令太麻煩的話,可以在 Android Studio 中建立 External Tools,並且加到工具列上頭,這樣子就可以點一下讓遠端的 M1 為你編譯程式了。